#ifndef HERM_BASE_CONTAINER_IDX_OBJ_MGR_H
#define HERM_BASE_CONTAINER_IDX_OBJ_MGR_H

#include "allocator.h"

namespace herm{

template <class T>
class IdxObjMgr
{
public:
	IdxObjMgr(int size) : m_allocator(size)
	{

	}

	int Malloc()
	{
		int idx = m_allocator.AllocateIdx();
		T* ptr = GetObj(idx);
		if (!ptr)
			return INVALID_IDX;

		::new (ptr) T; 

		return idx;
	}

	template <class P>
	int Malloc(P& p)
	{
		int idx = m_allocator.AllocateIdx();
		T* ptr = GetObj(idx);
		if (!ptr)
			return INVALID_IDX;

		::new (ptr) T(p); 

		return idx;
	}

	void Free(int idx)
	{
		T* ptr = GetObj(idx);
		if (!ptr)
			return;

		m_allocator.Free(ptr);
	}

	T* GetObj(int idx)
	{
		return m_allocator.GetObj(idx);
	}
private:
	Allocator<T> m_allocator;
};
}

#endif
